package cn.kgm;

import cn.kgm.thread.RunableImpl;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程池测试
 *
 * @Version 1.8
 * @Author: Kappi
 * @Date: 2023-9-11 15:20
 * @Description: cn.kgm.ThreadPoolDemo
 */
public class ThreadPoolDemo {

    /**
     * 线程池七个重要参数：
     * corePoolSize： 线程池核心线程数
     * maximumPoolSize： 线程池最大线程数（临时线程数+核心线程数）
     * keepAliveTime： 线程池中非核心线程空闲的存活时间大小（临时线程的存活时间）
     * unit： 临时线程空闲存活时间单位（如果临时线程在这个时间内没有执行任务，就会被销毁）
     * workQueue： 存放任务的阻塞队列（阻塞队列满了，才会创建非核心线程）
     * threadFactory： 用于设置创建线程的工厂，可以给创建的线程设置有意义的名字，方便排查问题。
     * handler：  线城池的饱和策略事件，主要有四种类型。（触发条件是，线程数量达到最大线程数，然后阻塞队列也满了）
     * @param args
     */

    /**
     * 四种拒绝策略:
     * AbortPolicy(抛出一个异常，默认的)
     * DiscardPolicy(直接丢弃任务)
     * DiscardOldestPolicy（丢弃队列里最老的任务，将当前这个任务继续提交给线程池）
     * CallerRunsPolicy（交给线程池调用所在的线程进行处理)
     *
     * @param args
     */
    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                5, 10,
                60, TimeUnit.MINUTES,
                new LinkedBlockingQueue<>(10),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());

        threadPoolExecutor.execute(() -> {
            System.out.println("他好");
        });

        threadPoolExecutor.execute(
                new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("我好");
                    }
                }
        );

        threadPoolExecutor.execute(new RunableImpl());

        threadPoolExecutor.shutdownNow();
    }
}
